S3をソースとした時のCodeBuild実行エラー「YAML_FILE_ERROR Message: YAML file does not exist」の対処法
こんにちはこーへいです!
今回はCodeBuildにて「YAML_FILE_ERROR Message: YAML file does not exist」が発生して結構苦戦したので備忘録として記します。
結論
demo
├── buildspec.yml
└── Dockerfile
└── src
└──...
└── ...
上記の様なディレクトリをzip化する際は、正しいディレクトリで圧縮してください(後述しますが私はdemoディレクトリの一個上の階層でdemoディレクトリ含めてzip化しちゃっていました...)。
~/example/demo
$ zip -r demo.zip *
正しいディレクトリ
~/example
$ zip -r demo.zip *
正しくないディレクトリ
経緯
設定確認
今回CodeBuildのソースとしてS3を利用した場合の検証を行なっていました。
CodeBuildの設定ではS3のオブジェクトキーとして「demo.zip」を指定しています(demo.zipの中にデプロイ用のソースコードや後述するbuildspec.ymlが含まれています)。
そしてデフォルトのbuildspec.ymlを利用するように設定していました。
S3にはもちろん「demo.zip」を格納しています。
エラー内容
この様な状況でCodeBuildを動かすと、「DOWNLOAD_SOURCE」フェーズにて「YAML_FILE_ERROR: YAML file does not exist」つまり、buildspec.ymlファイルが無いと怒られてしまいました。
原因
原因は上記の通り、demo.zipをdemoディレクトリ以下から圧縮していたことが原因でした。これでは「buildspec.yml」ではなくて「demo/buildspec.yml」と指定しなければなりません。
普通に圧縮するべきディレクトリの位置が間違っていただけでした。
おまけ
何故すぐにこの問題が解決できなかったかというと、以下の様に正しい位置でzip化した場合に、Macのダブルクリックでzipファイルを展開します。
すると上記の通り、zipファイル名を親ディレクトリとして展開される挙動となります。
しかし、unzipコマンドで展開すると圧縮する前の状態のまま展開されました。
長年Macのダブルクリックでzipファイルを展開していたため展開後のディレクトリ構造の理解があやふやだったため、今回の様なエラーに遭遇したというわけです。
zipファイル名と圧縮する前のディレクトリ名が同じ場合は、Macのダブルクリックで展開した場合、demo/demoみたいな感じにならないので今の今まで間違った理解をしていることに気付けませんでした。
終わりに
それなりに苦戦したトラシューだったのですが、蓋を開けてみればただのzipにまつわるお話でした。
年明けから疲れましたが、詳しくなれてよかったです。